package gomz.pres.question;

import gomz.GlobalRes;
import gomz.pres.GUICategory;
import gomz.pres.GUIMain;
import gomz.res.Category;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 * Diese Klasse steuert das UI der Fragestellung. Es reagiert auf die Eingaben des Benutzers.
 * @author Murillo
 */
public class CQQuestion {

	// ********************************************************************************
	// Variablen
	// ********************************************************************************
	private MQuestion model;
	private GUIQQuestion view;
	private GUIMain mainWindow;
	
	//*********************************************************************************
	// Konstruktor
	// ********************************************************************************
	/**
	 * Konstruktor fuer den Controller fuer eine einzelne Frage
	 * @param mainWindow Vaterfenster
	 * @param view UI das verwaltet werden soll
	 * @param model Model mit den Daten
	 */
	public CQQuestion(GUIMain mainWindow, GUIQQuestion view, MQuestion model) {
		this.model = model;
		this.view = view;
		this.mainWindow = mainWindow;
		
		addListener();
	}
	
	// ********************************************************************************
	// Listener
	// ********************************************************************************
	/**
	 * Diese Methode fuegt die Listener hinzu
	 */
	private void addListener(){
		//Buttons**********************************************************************
		//Neue Kategorie
		view.getBtFnewCategory().addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				doNewCat();	
			}
		});
		//Speichern
		view.getBtFsave().addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				doSave();
			}
		});
		//Zuruecksetzen
		view.getBtFcan().addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				doCancel();	
			}
		});
		
		//Regler***********************************************************************
		view.getSlFl1().addChangeListener(new ChangeListener(){
			public void stateChanged (ChangeEvent e){
				doLineChange(1, view.getSlFl1().getValue());
			}
		});
		view.getSlFl2().addChangeListener(new ChangeListener(){
			public void stateChanged (ChangeEvent e){
				doLineChange(2, view.getSlFl2().getValue());
			}
		});
		view.getSlFl3().addChangeListener(new ChangeListener(){
			public void stateChanged (ChangeEvent e){
				doLineChange(3, view.getSlFl3().getValue());
			}
		});
		view.getSlFl4().addChangeListener(new ChangeListener(){
			public void stateChanged (ChangeEvent e){
				doLineChange(4, view.getSlFl4().getValue());
			}
		});
		view.getSlFl5().addChangeListener(new ChangeListener(){
			public void stateChanged (ChangeEvent e){
				doLineChange(5, view.getSlFl5().getValue());
			}
		});
		view.getSlFl6().addChangeListener(new ChangeListener(){
			public void stateChanged (ChangeEvent e){
				doLineChange(6, view.getSlFl6().getValue());
			}
		});
	}
	
	// ********************************************************************************
	// Methoden
	// ********************************************************************************
	/**
	 * Diese Metho erstellt eine neue Kategorie
	 */
	protected void doNewCat(){
		GUICategory catGui = new GUICategory(mainWindow);
		if (catGui.showDialog()){
			String catName = catGui.getTfCategory().getText();
			
			if((catName==null) || catName.equals("")) {
				JOptionPane.showMessageDialog(mainWindow, "Die Kategorie wurde nicht erstellt, da kein Name angegeben wurde.", "Kategorie erstellen", JOptionPane.ERROR_MESSAGE);
			} else {
				boolean re = model.addNewCategory(catName);
				if(!re){
					JOptionPane.showMessageDialog(mainWindow, "Die Kategorie konnte nicht erstellt werden", "Kategorie erstellen", JOptionPane.ERROR_MESSAGE);
				}
				else{
					view.getLiFcategory().setListData(model.getCategoryList());
				}
			}
		}
	}
	
	/**
	 * Diese Methode speichert die Fragestellung mit den Daten aus dem UI auf dem Server
	 */
	public void doSave(){
		if(view.getTfFtitle().getText().equals("")){
			JOptionPane.showMessageDialog(mainWindow, "Bitte geben Sie der Frage einen Titel.", "Fragestellung speichern", JOptionPane.WARNING_MESSAGE);
		}
		else{
			int[] lines = new int[6];
			ArrayList<Category> categories = new ArrayList<Category>();
			
			//Werte der Linien auslesen
			lines[0] = view.getSlFl6().getValue();
			lines[1] = view.getSlFl5().getValue();
			lines[2] = view.getSlFl4().getValue();
			lines[3] = view.getSlFl3().getValue();
			lines[4] = view.getSlFl2().getValue();
			lines[5] = view.getSlFl1().getValue();
			
			//Die ausgewaehlten Kategorien zusammenstellen.
			int[] si = view.getLiFcategory().getCheckedIndeces();
			for(int i = 0; i < si.length; i++){
				categories.add(model.getCategories().get(si[i]));
			}
			
			//Speichern
			boolean re = model.saveQuestion(categories, view.getCbFpublic().isSelected(), view.getTfFtitle().getText(), view.getTaFquestion().getText(), view.getTaFana().getText(), view.getTaFsyn().getText(), view.getTaFback().getText(), lines);
			if (!re){
				JOptionPane.showMessageDialog(mainWindow, "Die Fragestellung konnte nicht gespeichert werden.", "Fragestellung speichern", JOptionPane.ERROR_MESSAGE);
			}
			else{
				//Falls die Fragestellung gespeichert werden konnte, die lokalen Daten anpassen und die restlichen tabs enablen
				if (model.getQuestion()!= null)	view.getTfFdate().setText(model.getQuestion().getCreated().toString());
				for (int ti = 2; ti < mainWindow.getTabbsQuestion().getTabCount(); ti++){
					mainWindow.getTabbsQuestion().setEnabledAt(ti, true);
				}
				mainWindow.getTabbsQuestion().setSelectedIndex(2);
			}
		}
	}
	
	/**
	 * Diese Methode setzt die Daten auf dem UI zurueck
	 */
	public void doCancel(){
		if(model.getQuestion() != null){
			view.getTfFdate().setText(model.getQuestion().getCreateDateFormated());
			view.getTfFuser().setText(model.getQuestion().getUser().getUsername());
			view.getCbFpublic().setSelected(model.getQuestion().isIsPublic());
			view.getTfFtitle().setText(model.getQuestion().getTitle());
			view.getTaFquestion().setText(model.getQuestion().getQuestion());
			view.getTaFana().setText(model.getQuestion().getAnalysis());
			view.getTaFback().setText(model.getQuestion().getFeedback());
			
			view.getLiFcategory().setListData(model.getCategoryList());
			for (Category cat : model.getQuestion().getCat()){
				view.getLiFcategory().setCheckedIndex(model.getCategories().indexOf(cat));
			}
			
			view.getSlFl1().setValue(model.getQuestion().getLines()[5]);
			view.getSlFl2().setValue(model.getQuestion().getLines()[4]);
			view.getSlFl3().setValue(model.getQuestion().getLines()[3]);
			view.getSlFl4().setValue(model.getQuestion().getLines()[2]);
			view.getSlFl5().setValue(model.getQuestion().getLines()[1]);
			view.getSlFl6().setValue(model.getQuestion().getLines()[0]);
		}
	}
	
	/**
	 * Diese Methode zeichnet eine Linien des Hexagramms
	 * @param line zu Zeichnende Linie
	 * @param value Linienart bzw. Zahl die gezeichnet werden soll
	 */
	private void doLineChange(int line, int value){
		JLabel lineToChange;
		//label mit der Linie ermitteln
		switch(line){
		default:
			lineToChange = view.getLbLine1();
			break;
		case 1:
			lineToChange = view.getLbLine1();
			break;
		case 2:
			lineToChange = view.getLbLine2();
			break;
		case 3:
			lineToChange = view.getLbLine3();
			break;
		case 4:
			lineToChange = view.getLbLine4();
			break;
		case 5:
			lineToChange = view.getLbLine5();
			break;
		case 6:
			lineToChange = view.getLbLine6();
			break;
		}
		
		//Bild (Linienart) ermitteln und setzten
		switch(value){
		default:
			lineToChange.setIcon(view.getImgLine3());
			break;
		case 6:
			lineToChange.setIcon(view.getImgLine3()); //altes Yin (unterbrochene Linie mit X)
			break;
		case 7:
			lineToChange.setIcon(view.getImgLine1()); //junges Yang (durchgezogene Linie)
			break;
		case 8:
			lineToChange.setIcon(view.getImgLine2()); //junges Yin (unterbrochene Linie)
			break;
		case 9:
			lineToChange.setIcon(view.getImgLine4()); //altes Yang (durchgezogene Linie mit kreis)
			break;
		}
	}
	
	/**
	 * Diese Methode fuellt die Felder mit den Daten der als aktuell in bearbeitung bezeichneten Fragestellung
	 */
	public void fillData(){
		if(model.getQuestion() != null){
			view.getTfFdate().setText(model.getQuestion().getCreateDateFormated());
			view.getTfFuser().setText(model.getQuestion().getUser().getUsername());
			view.getCbFpublic().setSelected(model.getQuestion().isIsPublic());
			view.getCbFpublic().setEnabled(GlobalRes.getActivUser().getId() == model.getQuestion().getUser().getId());
			view.getTfFtitle().setText(model.getQuestion().getTitle());
			view.getTaFquestion().setText(model.getQuestion().getQuestion());
			view.getTaFana().setText(model.getQuestion().getAnalysis());
			view.getTaFsyn().setText(model.getQuestion().getSynthesis());
			view.getTaFback().setText(model.getQuestion().getFeedback());
			
			//Possition an den Anfgan der Textarea setzten
			view.getTaFquestion().setCaretPosition(0);
			view.getTaFana().setCaretPosition(0);
			view.getTaFsyn().setCaretPosition(0);
			view.getTaFback().setCaretPosition(0);
			
			view.getLiFcategory().setListData(model.getCategoryList());
			for (Category cat : model.getQuestion().getCat()){
				for(Category catInList : model.getCategories()){
					if(catInList.getId() == cat.getId()){
						view.getLiFcategory().setCheckedIndex(model.getCategories().indexOf(catInList));
					}
				}
			}
			
			view.getSlFl1().setValue(model.getQuestion().getLines()[5]);
			view.getSlFl2().setValue(model.getQuestion().getLines()[4]);
			view.getSlFl3().setValue(model.getQuestion().getLines()[3]);
			view.getSlFl4().setValue(model.getQuestion().getLines()[2]);
			view.getSlFl5().setValue(model.getQuestion().getLines()[1]);
			view.getSlFl6().setValue(model.getQuestion().getLines()[0]);
		}
	}
}
